package com.fz.us.oa.web.controller.com;

import com.fz.us.admin.base.bean.BaseEnumManager;
import com.fz.us.admin.base.bean.jqgrid.JqGridFilter;
import com.fz.us.admin.base.bean.jqgrid.JqGridPager;
import com.fz.us.admin.base.bean.search.SearchEnum;
import com.fz.us.admin.base.bean.search.order.Order;
import com.fz.us.admin.base.bean.search.result.SearchResultPaging;
import com.fz.us.admin.base.utils.DataUtil;
import com.fz.us.admin.company.bean.FlowEnum;
import com.fz.us.admin.company.entity.Company;
import com.fz.us.admin.company.entity.TaskEntity;
import com.fz.us.admin.company.entity.User;
import com.fz.us.admin.company.service.PostService;
import com.fz.us.oa.core.entity.com.Quit;
import com.fz.us.oa.core.service.com.QuitService;
import com.fz.us.oa.web.controller.BaseController;
import com.fz.us.oa.web.shiro.bind.annotation.CurrentUser;
import com.fz.us.oa.web.spring.bind.annotation.RequestJsonParam;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.*;

/**
 * Created by dzw on 2017/12/12.
 */
@Controller
@RequestMapping(value = "/com/quit")
public class QuitController extends BaseController {
    private static final long serialVersionUID = -2984631192148504521L;

    @Autowired
    private QuitService quitService;
    @Autowired
    private PostService postService;

    /**
     * 列表
     */
    @RequestMapping(value = "list", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    public Map<String, Object> list(@CurrentUser User user,Model model,
                                    String viewtype,
                                    JqGridPager pager,
                                    @RequestJsonParam(value = "filters", required = false) JqGridFilter filters) {
        Company company = user.getCompany();
        // 排序
        Order order = Order.order("createTime", SearchEnum.OrderType.desc);
        SearchResultPaging searchResult = null;
        Map<String,Object> params = new HashMap<String,Object>();
        params.put("company", company);
        params.put("state", BaseEnumManager.StateEnum.Enable);
        if(StringUtils.isNotEmpty(viewtype)) {
            if ("1".equals(viewtype)) {
                //申请中
                searchResult = quitService.paging(order,
                        "com.fz.us.oa.core.entity.com.Quit", new FlowEnum.ProcessState []{FlowEnum.ProcessState.Running, FlowEnum.ProcessState.Backed},params);
            }else if("2".equals(viewtype)){
                //已通过
                searchResult =  quitService.paging(order,
                        "com.fz.us.oa.core.entity.com.Quit", new FlowEnum.ProcessState []{FlowEnum.ProcessState.Finished}, params);
            }else if("3".equals(viewtype)){
                //已否决
                searchResult =  quitService.paging(order,
                        "com.fz.us.oa.core.entity.com.Quit", new FlowEnum.ProcessState []{FlowEnum.ProcessState.Deny}, params);
            }
        }else{
            //所有单子
            searchResult = quitService.paging(order,
                    "com.fz.us.oa.core.entity.com.Quit",
                    new FlowEnum.ProcessState []{FlowEnum.ProcessState.Running, FlowEnum.ProcessState.Backed, FlowEnum.ProcessState.Finished, FlowEnum.ProcessState.Deny}, params);
        }
        List<Quit> quitList = searchResult.getList();
        ArrayList<Map<String, Object>> dataRows = new ArrayList<Map<String, Object>>();
        Map<String, Object> data = new HashMap<String, Object>();
        Map<String,Object> rMap;
        for(Quit quit : quitList){
            TaskEntity taskEntity = taskEntityService.getInfoByKeyId(quit.getId());
            Set<User> users = taskEntity.getEditors();
            String editor = "";
            for(User editorName:users){
                editor += editorName.getName()+",";
            }
            if(StringUtils.isNotEmpty(editor)){
                editor = editor.substring(0, editor.length()-1);
            }
            rMap = new HashMap<String, Object>();
            rMap.put("id",quit.getId());
            rMap.put("quitUser", quit.getQuitUser()!=null?quit.getQuitUser().getName():"");
            rMap.put("quitDate", DataUtil.DateToString(quit.getQuitDate(),"yyyy-MM-dd"));
            rMap.put("nextUser", quit.getNextUser()!=null?quit.getNextUser().getName():"");
            rMap.put("editor", editor);
            dataRows.add(rMap);
        }
        data.put("dataRows", dataRows);
        data.put("page", searchResult.getPageNumber());
        data.put("rows", searchResult.getPageSize());
        data.put("records", searchResult.getTotalCount());
        data.put("total", searchResult.getPageCount());
        return data;
    }

    /**
     * 新建，编辑页面
     */
    @RequestMapping(value = "input", method = RequestMethod.GET, produces = MediaType.TEXT_HTML_VALUE)
    public String input(@CurrentUser User user, Model model,String keyId,String draft,String index,String todo,String remind,String record) {
        if (StringUtils.isNotEmpty(keyId)){
            Quit quit=quitService.get(keyId);
            model.addAttribute("keyId", keyId);
            model.addAttribute("quit", quit);
        }
        model.addAttribute("draft", draft);
        model.addAttribute("index", index);
        model.addAttribute("todo", todo);
        model.addAttribute("remind", remind);
        model.addAttribute("record", record);
        return "/com/quit_input";
    }

    /**
     * 只读页面
     */
    @RequestMapping(value = "read", method = RequestMethod.GET, produces = MediaType.TEXT_HTML_VALUE)
    public String read(@CurrentUser User user, Model model,String keyId,String draft,String index,String todo,String remind,String record) {

        if(StringUtils.isNotEmpty(keyId)) {
            Quit quit=quitService.get(keyId);
            String userEdit = userEdit(keyId);
            model.addAttribute("quit", quit);
            model.addAttribute("userEdit", userEdit);
        }
        model.addAttribute("keyId", keyId);
        model.addAttribute("draft", draft);
        model.addAttribute("index", index);
        model.addAttribute("todo", todo);
        model.addAttribute("remind", remind);
        model.addAttribute("record", record);
        return "/com/quit_read";
    }

    /**
     * 选择岗位
     */
    @RequestMapping(value = "postDialog", method = RequestMethod.GET, produces = MediaType.TEXT_HTML_VALUE)
    public String postDialog(){
        return "/com/quit_post_dialog";
    }

    /**
     * 赋值
     */
    public Quit setData(@CurrentUser User user, String keyId, String quitUserId, String entryDate, String quitDate, String thePostId, String nextUserId,
                        String contractStartDate, String contractEndDate, String quitReason, String theThing){
        Quit quit=null;
        if(StringUtils.isEmpty(keyId)){
            quit=new Quit();
            quit.setCreater(user);
            quit.setCompany(user.getCompany());
        }else{
            quit=quitService.get(keyId);
        }
        quit.setQuitUser(userService.get(quitUserId));
        quit.setEntryDate(DataUtil.StringToDate(entryDate));
        quit.setQuitDate(DataUtil.StringToDate(quitDate));
        quit.setThePost(postService.get(thePostId));
        quit.setNextUser(userService.get(nextUserId));
        quit.setContractStartDate(DataUtil.StringToDate(contractStartDate));
        quit.setContractEndDate(DataUtil.StringToDate(contractEndDate));
        quit.setQuitReason(quitReason);
        quit.setTheThing(theThing);

        return quit;
    }

    /**
     * 保存操作
     */
    @RequestMapping(value = "save", method = RequestMethod.POST)
    public Object save(@CurrentUser User user, String keyId, String quitUserId, String entryDate, String quitDate, String thePostId, String nextUserId,
                       String contractStartDate, String contractEndDate, String quitReason, String theThing) {
        Map<String,Object> rMap=new HashMap<String,Object>();
        Quit quit=setData(user,keyId,quitUserId,entryDate,quitDate,thePostId,nextUserId,contractStartDate,contractEndDate,quitReason,theThing);
        if(StringUtils.isNotEmpty(keyId)){
            quitService.update(quit);
            rMap.put("message", "更新成功");
        } else {
            quitService.save(quit, "com.fz.us.oa.core.entity.com.Quit");
            rMap.put("message", "保存成功");
        }
        rMap.put("state", "1");
        rMap.put("keyId", keyId);
        return ajaxJson(rMap);
    }

    // 提交
    @RequestMapping(value = "commit", method = RequestMethod.POST)
    public Object commit(@CurrentUser User user, String keyId, String quitUserId, String entryDate, String quitDate, String thePostId, String nextUserId,
                         String contractStartDate, String contractEndDate, String quitReason, String theThing, String comment, String next,
                         String editorsId, String remindUserId){
        User editor = null;
        if(StringUtils.isNotEmpty(editorsId)){
            editor = userService.get(editorsId);
        }
        Map<String,Object> rMap=new HashMap<String,Object>();
        Quit quit=setData(user,keyId,quitUserId,entryDate,quitDate,thePostId,nextUserId,contractStartDate,contractEndDate,quitReason,theThing);
        if (StringUtils.isNotEmpty(keyId)) {
            quitService.approve(quit, user, comment, next, editor);
        } else {
            keyId=quitService.commit(quit, "com.fz.us.oa.core.entity.com.Quit", user, next, editor);
        }
        toRemind("quit", keyId, remindUserId, user.getName()+"提交的离职申请，请查看");
        rMap.put("message", "提交成功");
        rMap.put("state", "1");
        rMap.put("keyId", keyId);
        return ajaxJson(rMap);
    }

    //审批
    @RequestMapping(value = "approve", method = RequestMethod.POST)
    public Object approve(@CurrentUser User user, String keyId,  String comment, String next, String editorsId, String remindUserId){
        User editor = null;
        if(StringUtils.isNotEmpty(editorsId)){
            editor = userService.get(editorsId);
        }
        Map<String,Object> rMap=new HashMap<String,Object>();
        Quit quit=quitService.get(keyId);
        quitService.approve(quit, user, comment, next, editor);
        toRemind("quit", keyId, remindUserId, user.getName() + "提交的离职申请，请查看");
        rMap.put("message", "提交成功");
        rMap.put("state", "1");
        rMap.put("keyId", keyId);
        return ajaxJson(rMap);
    }

    //退回
    @RequestMapping(value = "back", method = RequestMethod.POST)
    public Object back(@CurrentUser User user, String keyId,String backStepNo, String comment, String remindUserId) {
        if (StringUtils.isNotEmpty(keyId)) {
            Quit quit=quitService.get(keyId);
            if(StringUtils.isNotEmpty(backStepNo)){
                String[] arr = backStepNo.split("\\|");
                int stepNo = Integer.parseInt(arr[0]);
                User editor = userService.get(arr[1]);
                quitService.back(quit, comment, stepNo, editor);
                toRemind("quit", keyId, remindUserId, user.getName() + "退回的离职申请，请查看");
            }
        }
        Map<String,Object> rMap=new HashMap<String,Object>();
        rMap.put("message","退回成功");
        rMap.put("state","1");
        rMap.put("keyId", keyId);
        return ajaxJson(rMap);
    }

    //否决
    @RequestMapping(value = "deny", method = RequestMethod.POST)
    public Object deny(@CurrentUser User user, String keyId, String comment, String remindUserId) {
        if (StringUtils.isNotEmpty(keyId)) {
            Quit quit=quitService.get(keyId);
            quitService.deny(quit, comment);
            toRemind("quit", keyId, remindUserId, user.getName()+"否决的离职申请，请查看");
        }
        Map<String,Object> rMap=new HashMap<String,Object>();
        rMap.put("message","否决成功");
        rMap.put("state","1");
        rMap.put("keyId", keyId);
        return ajaxJson(rMap);
    }

}
